package com.my.db.test.mybatis.enums.defal;

/**
 * @author timo 2021/3/29
 */

import org.springframework.context.i18n.LocaleContextHolder;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Created by Tyler on 2017/6/5.
 */

@SuppressWarnings({"unchecked"})
public class EnumHelper {

    /**
     * 获取枚举集合
     *
     * Enum
     *
     * @param <T>
     * @return List<EnumItem>
     */
    public static <T extends CustomEnums.IEnum> List<EnumItem> getEnumList(
            Class<? extends CustomEnums.IEnum> enumClass) {
        T[] q = (T[]) enumClass.getEnumConstants();
        List<EnumItem> v = Arrays.stream(q).map(T::getEnumItem).collect(Collectors.toList());
        return v;
    }

    /**
     * 根据字符串，动态获取枚举值
     * @param enumName
     * @param <T>
     * @return
     * @throws ClassNotFoundException
     */
    public static <T extends CustomEnums.IEnum> List<EnumItem> getEnumList(
            String enumName)
            throws ClassNotFoundException {
        Class enumClass=Class.forName(CustomEnums.class.getName()+"$"+enumName);
        return getEnumList(enumClass);
    }

    /**
     * 获取枚举[多语言]集合
     *
     *            Enum
     * @param <T>
     * @return List<EnumItem>
     */
    public static <T extends CustomEnums.IEnum> List<EnumItem> getEnumLangList(Class<? extends CustomEnums.IEnum> enumClass) {
        String lang = LocaleContextHolder.getLocale().toString();
        List<EnumItem> v = getEnumList(enumClass);
        v.stream().forEach(x->{
            if (lang.equals(CustomEnums.LangEnum.Chinese.getEnumItem().getItemValue())) {
                x.setItemValue(x.getItemCN());
            } else if (lang.equals(CustomEnums.LangEnum.English.getEnumItem().getItemValue())) {
                x.setItemValue(x.getItemEN());
            }
        });
        return v;
    }


    /**
     * 根据枚举类型和key获取信息
     *
     * @param enumClass
     *            Enum
     * @param key
     *            Enum key
     * @param <T>
     * @return EnumItem
     */
    public static <T extends CustomEnums.IEnum> EnumItem getEnumItem(Class<? extends CustomEnums.IEnum> enumClass,
                                                                      Integer key) {
        T[] q = (T[]) enumClass.getEnumConstants();
        Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getItemKey() == key).findFirst();
        if (v.equals(Optional.empty())){
            return null;
        }
        T r = v.get();
        EnumItem s = r.getEnumItem();
        return s;
    }

    /**
     * 根据枚举类型和value获取信息
     *
     * @param enumClass
     *            Enum
     * @param value
     *            Enum value
     * @param <T>
     * @return EnumItem
     */
    public static <T extends CustomEnums.IEnum> EnumItem getEnumItem(Class<? extends CustomEnums.IEnum> enumClass,
                                                                      String value) {
        T[] q = (T[]) enumClass.getEnumConstants();
        Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getItemValue().equals(value)).findFirst();
        if (v.equals(Optional.empty())){
            return null;
        }
        T r = v.get();
        EnumItem s = r.getEnumItem();
        return s;
    }


    /**
     * 根据枚举类型和key获取多语言信息
     * @param enumClass
     *            Enum
     * @param key
     *            Enum key
     * @param <T>
     * @return String
     */
    public static <T extends CustomEnums.IEnum> String getEnumLangItem(Class<? extends CustomEnums.IEnum> enumClass,
                                                                        Integer key) {
        String r = "";
        EnumItem s = getEnumItem(enumClass, key);
        String lang = LocaleContextHolder.getLocale().toString();

        if (s == null){
            return r;
        }
        if (lang.equals(CustomEnums.LangEnum.Chinese.getEnumItem().getItemValue())) {
            r = s.getItemCN();
        } else if (lang.equals(CustomEnums.LangEnum.English.getEnumItem().getItemValue())) {
            r = s.getItemEN();
        }
        return r;
    }


//    public static <T extends EnumList.IEnumList> String getEnumLangItem2(Class<? extends EnumList.IEnumList> enumClass,
//                                                                         String keys) {
//        String r = "";
//        List<Integer> list = ListUtil.stringToList(keys);
//        for(Integer key:list){
//            r+=getEnumLangItem(enumClass,key)+",";
//        }
//        return r.endsWith(",")?r.substring(0,r.lastIndexOf(',')):r;
//    }

    /**
     * 将枚举装成map
     */
//    public static <T extends EnumList.IEnumList> Map<String, Object> getEnumMap(Class<T> enumClass) {
//        Map<String, Object> resMap = ListUtil.initMap();
//        T[] q = (T[]) enumClass.getEnumConstants();
//        if (q != null && q.length > 0) {
//            for (T t : q) {
//                resMap.put(t.toString(), t.getEnumItem());
//            }
//        }
//        return resMap;
//    }

}
